import json
import subprocess  # 导入subprocess模块来执行系统命令
from ip6info_to_json import get_ip6_addresses  # 假设这是获取IPv6地址的函数

def is_ip6_reachable(ip6_address):
    """使用 ping6 命令检查指定的IPv6地址是否可达"""
    try:
        # 移除地址后缀 /64
        address_without_prefix = ip6_address.split('/')[0]
        
        # 执行 ping6 命令，-c 3 表示发送3个请求包，-I 指定源IPv6地址
        result = subprocess.run(['ping6', '-c', '3', '-I', address_without_prefix, '2001:dc7:1000::1'], 
                                stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        
        # 打印ping6命令的输出结果，方便调试
        print(f"Ping6 result for {address_without_prefix}:\n{result.stdout}")
        
        # 检查输出中是否有 'received'，如果有至少一个包被接收，就认为目标地址可达
        return 'received' in result.stdout
    except subprocess.CalledProcessError as e:
        # 如果执行过程中出错，则认为该IPv6不可达
        print(f"Error while pinging {ip6_address}: {e}")
        return False

def filter_ip6_reachable():
    # 获取所有 IPv6 地址数据
    result = get_ip6_addresses()
    
    # 解析为 JSON 数据
    data = json.loads(result)
    
    # 打印接口和地址信息，方便调试
    print(f"Interfaces and Addresses: {data['interfaces']}")
    
    # 存储可达的 IPv6 地址
    reachable_ips = []

    # 遍历接口列表
    for interface in data['interfaces']:
        # 遍历每个接口的地址
        for address in interface['addresses']:
            # 使用 ping6 命令检测该 IPv6 地址是否可达
            if is_ip6_reachable(address['inet6']):
                reachable_ips.append(address['inet6'])
    
    # 返回可达的 IP 地址列表
    return reachable_ips

# 调用函数并打印结果
if __name__ == '__main__':
    reachable_ips = filter_ip6_reachable()
    print(f"Reachable IPs: {reachable_ips}")

